in src/plugins/console/public/lib/autocomplete/autocomplete.ts [345:452]
function applyTerm(term: any) {
const context = term.context;
// make sure we get up to date replacement info.
addReplacementInfoToContext(context, editor.getCurrentPosition(), term.insertValue);
let termAsString;
if (context.autoCompleteType === 'body') {
termAsString =
typeof term.insertValue === 'string' ? '"' + term.insertValue + '"' : term.insertValue + '';
if (term.insertValue === '[' || term.insertValue === '{') {
termAsString = '';
}
} else {
termAsString = term.insertValue + '';
}
let valueToInsert = termAsString;
let templateInserted = false;
if (context.addTemplate && !_.isUndefined(term.template) && !_.isNull(term.template)) {
let indentedTemplateLines;
// In order to allow triple quoted strings in template completion we check the `__raw_`
// attribute to determine whether this template should go through JSON formatting.
if (term.template.__raw && term.template.value) {
indentedTemplateLines = term.template.value.split('\n');
} else {
indentedTemplateLines = utils.jsonToString(term.template, true).split('\n');
}
let currentIndentation = editor.getLineValue(context.rangeToReplace.start.lineNumber);
currentIndentation = currentIndentation.match(/^\s*/)![0];
for (
let i = 1;
i < indentedTemplateLines.length;
i++ // skip first line
) {
indentedTemplateLines[i] = currentIndentation + indentedTemplateLines[i];
}
valueToInsert += ': ' + indentedTemplateLines.join('\n');
templateInserted = true;
} else {
templateInserted = true;
if (term.value === '[') {
valueToInsert += '[]';
} else if (term.value === '{') {
valueToInsert += '{}';
} else {
templateInserted = false;
}
}
valueToInsert = context.prefixToAdd + valueToInsert + context.suffixToAdd;
// disable listening to the changes we are making.
editor.off('changeSelection', editorChangeListener);
if (context.rangeToReplace.start.column !== context.rangeToReplace.end.column) {
editor.replace(context.rangeToReplace, valueToInsert);
} else {
editor.insert(valueToInsert);
}
editor.clearSelection(); // for some reason the above changes selection
// go back to see whether we have one of ( : { & [ do not require a comma. All the rest do.
let newPos = {
lineNumber: context.rangeToReplace.start.lineNumber,
column:
context.rangeToReplace.start.column +
termAsString.length +
context.prefixToAdd.length +
(templateInserted ? 0 : context.suffixToAdd.length),
};
const tokenIter = createTokenIterator({
editor,
position: newPos,
});
if (context.autoCompleteType === 'body') {
// look for the next place stand, just after a comma, {
let nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
switch (nonEmptyToken ? nonEmptyToken.type : 'NOTOKEN') {
case 'paren.rparen':
newPos = tokenIter.getCurrentPosition();
break;
case 'punctuation.colon':
nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
if ((nonEmptyToken || ({} as any)).type === 'paren.lparen') {
nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
newPos = tokenIter.getCurrentPosition();
if (nonEmptyToken && nonEmptyToken.value.indexOf('"') === 0) {
newPos.column++;
} // don't stand on "
}
break;
case 'paren.lparen':
case 'punctuation.comma':
tokenIter.stepForward();
newPos = tokenIter.getCurrentPosition();
break;
}
editor.moveCursorToPosition(newPos);
}
// re-enable listening to typing
editor.on('changeSelection', editorChangeListener);
}