in src/yaml/yamlUtils.ts [127:247]
function processLineWithColon(
document: TextDocument,
cursorPosition: Position,
currentLine: string,
currentLineEnd: number,
): ProcessYamlDocForCompletionOutput {
const docText = document.getText()
const docTextLength = docText.length
let modifiedDocText: string = docText
let shouldPrependSpace = false
const tempPositionForCompletions: Position = { ...cursorPosition }
const startPositionForInsertion: Position = { ...cursorPosition }
const endPositionForInsertion: Position = { ...cursorPosition }
const charNum = cursorPosition.character
const lineOffsets = getLineOffsets(docText)
let preText: string
let postText: string
let insertedText: string
// Current line has a colon, determine if cursor position is right or left of it
const colonIndex = currentLine.indexOf(':')
// Cursor is left of the colon.
if (charNum <= colonIndex) {
// Start position is first non-space character, ending position is left of colon.
const preColonTextTrimmed = currentLine.substring(0, colonIndex).trim()
// Only whitespace before the colon.
if (preColonTextTrimmed.length === 0) {
// Insert placeholder quotes and place cursor inside of them.
preText = docText.substring(0, lineOffsets[cursorPosition.line] + colonIndex)
insertedText = "''"
postText = docText.slice(lineOffsets[cursorPosition.line] + colonIndex)
startPositionForInsertion.character = colonIndex
endPositionForInsertion.character = colonIndex
tempPositionForCompletions.character = colonIndex + 1
// Only hyphen before the colon.
} else if (preColonTextTrimmed.length === 1 && preColonTextTrimmed.charAt(0) === '-') {
// Insert placeholder quotes and place cursor inside of them.
preText = docText.substring(0, lineOffsets[cursorPosition.line] + colonIndex)
insertedText = " ''"
postText = docText.slice(lineOffsets[cursorPosition.line] + colonIndex)
startPositionForInsertion.character = colonIndex
endPositionForInsertion.character = colonIndex
// Move cursor to be inside the quotes
tempPositionForCompletions.character = colonIndex + 2
shouldPrependSpace = currentLine.charAt(Math.max(colonIndex - 1, 0)) !== ' '
} else {
// Set start of insertion range to be where the non-whitespace characters start.
startPositionForInsertion.character = currentLine.indexOf(preColonTextTrimmed)
// Set end of insertion range to be immediately before the colon.
endPositionForInsertion.character = colonIndex
preText = docText
insertedText = ''
postText = ''
// If the non-whitespace characters start with a hyphen, adjust starting position to be after the hyphen
if (preColonTextTrimmed.charAt(0) === '-') {
startPositionForInsertion.character = Math.min(startPositionForInsertion.character + 2, colonIndex)
}
}
// Cursor is right of the colon.
} else {
// Starting position is immediately after the colon, end is end of line
startPositionForInsertion.character = colonIndex + 1
endPositionForInsertion.character = currentLine.length
shouldPrependSpace = true
// Remove all trailing whitespace on that line and adjust tempPositionForCompletions if needed
let numTrailingSpacesToRemove = 0
while (currentLine.charAt(currentLine.length - numTrailingSpacesToRemove - 1) === ' ') {
numTrailingSpacesToRemove++
}
tempPositionForCompletions.character = Math.min(
tempPositionForCompletions.character,
currentLine.length - numTrailingSpacesToRemove - 1,
)
// If after removing trailing spaces, the last character is the colon, add a placeholder empty string value
const postColonTextTrimmed = currentLine.substring(colonIndex + 1).trim()
const hasOnlyWhitespaceAfterColon = postColonTextTrimmed.length === 0
preText = docText.substring(0, currentLineEnd - numTrailingSpacesToRemove)
insertedText = (hasOnlyWhitespaceAfterColon ? ' ""' : '') + '\n'
postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength)
if (hasOnlyWhitespaceAfterColon) {
// Move cursor inside of quotes
tempPositionForCompletions.character += 2
} else {
// Current line has non-whitespace characters following the colon.
const indexOfPostColonCharacters = currentLine.indexOf(postColonTextTrimmed)
// Cursor is between colon and start of post-colon characters
if (charNum < indexOfPostColonCharacters) {
// Move cursor to be at immediately before the value
tempPositionForCompletions.character = indexOfPostColonCharacters
}
}
}
modifiedDocText = `${preText}${insertedText}${postText}`
return {
modifiedDocText,
tempPositionForCompletions,
startPositionForInsertion,
endPositionForInsertion,
shouldPrependSpace,
}
}