in src/plugins/console/public/lib/autocomplete/autocomplete.ts [672:768]
function addBodyPrefixSuffixToContext(context: any) {
// Figure out what happens next to the token to see whether it needs trailing commas etc.
// Templates will be used if not destroying existing structure.
// -> token : {} or token ]/} or token , but not token : SOMETHING ELSE
context.prefixToAdd = '';
context.suffixToAdd = '';
let tokenIter = createTokenIterator({
editor,
position: editor.getCurrentPosition()!,
});
let nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
switch (nonEmptyToken ? nonEmptyToken.type : 'NOTOKEN') {
case 'NOTOKEN':
case 'paren.lparen':
case 'paren.rparen':
case 'punctuation.comma':
context.addTemplate = true;
break;
case 'punctuation.colon':
// test if there is an empty object - if so we replace it
context.addTemplate = false;
nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
if (!(nonEmptyToken && nonEmptyToken.value === '{')) {
break;
}
nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
if (!(nonEmptyToken && nonEmptyToken.value === '}')) {
break;
}
context.addTemplate = true;
// extend range to replace to include all up to token
context.rangeToReplace.end.lineNumber = tokenIter.getCurrentTokenLineNumber();
context.rangeToReplace.end.column =
tokenIter.getCurrentTokenColumn() + nonEmptyToken.value.length;
// move one more time to check if we need a trailing comma
nonEmptyToken = parser.nextNonEmptyToken(tokenIter);
switch (nonEmptyToken ? nonEmptyToken.type : 'NOTOKEN') {
case 'NOTOKEN':
case 'paren.rparen':
case 'punctuation.comma':
case 'punctuation.colon':
break;
default:
context.suffixToAdd = ', ';
}
break;
default:
context.addTemplate = true;
context.suffixToAdd = ', ';
break; // for now play safe and do nothing. May be made smarter.
}
// go back to see whether we have one of ( : { & [ do not require a comma. All the rest do.
tokenIter = createTokenIterator({ editor, position: editor.getCurrentPosition() });
nonEmptyToken = tokenIter.getCurrentToken();
let insertingRelativeToToken; // -1 is before token, 0 middle, +1 after token
if (context.replacingToken) {
insertingRelativeToToken = 0;
} else {
const pos = editor.getCurrentPosition();
if (pos.column === context.updatedForToken.position.column) {
insertingRelativeToToken = -1;
} else if (
pos.column <
context.updatedForToken.position.column + context.updatedForToken.value.length
) {
insertingRelativeToToken = 0;
} else {
insertingRelativeToToken = 1;
}
}
// we should actually look at what's happening before this token
if (parser.isEmptyToken(nonEmptyToken) || insertingRelativeToToken <= 0) {
nonEmptyToken = parser.prevNonEmptyToken(tokenIter);
}
switch (nonEmptyToken ? nonEmptyToken.type : 'NOTOKEN') {
case 'NOTOKEN':
case 'paren.lparen':
case 'punctuation.comma':
case 'punctuation.colon':
case 'method':
break;
default:
if (nonEmptyToken && nonEmptyToken.type.indexOf('url') < 0) {
context.prefixToAdd = ', ';
}
}
return context;
}