in public/src/autocomplete.js [395:490]
function addBodyPrefixSuffixToContext(context) {
// 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 = "";
var tokenIter = editor.iterForCurrentLoc();
var nonEmptyToken = editor.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 = editor.parser.nextNonEmptyToken(tokenIter);
if (!(nonEmptyToken && nonEmptyToken.value == "{")) {
break;
}
nonEmptyToken = editor.parser.nextNonEmptyToken(tokenIter);
if (!(nonEmptyToken && nonEmptyToken.value == "}")) {
break;
}
context.addTemplate = true;
// extend range to replace to include all up to token
context.rangeToReplace.end.row = tokenIter.getCurrentTokenRow();
context.rangeToReplace.end.column = tokenIter.getCurrentTokenColumn() + nonEmptyToken.value.length;
// move one more time to check if we need a trailing comma
nonEmptyToken = editor.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 = editor.iterForCurrentLoc();
nonEmptyToken = tokenIter.getCurrentToken();
var insertingRelativeToToken; // -1 is before token, 0 middle, +1 after token
if (context.replacingToken) {
insertingRelativeToToken = 0;
}
else {
var pos = editor.getCursorPosition();
if (pos.column == context.updatedForToken.start) {
insertingRelativeToToken = -1;
}
else if (pos.column < context.updatedForToken.start + context.updatedForToken.value.length) {
insertingRelativeToToken = 0;
}
else {
insertingRelativeToToken = 1;
}
}
// we should actually look at what's happening before this token
if (editor.parser.isEmptyToken(nonEmptyToken) || insertingRelativeToToken <= 0) {
nonEmptyToken = editor.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;
}