in hybrid/src/main/java/jetbrains/jetpad/hybrid/TokenCompleter.java [174:237]
CompletionSupplier sideTransform(Cell tokenCell, final int delta) {
final int index = mySync.tokenCells().indexOf(tokenCell);
return new CompletionSupplier() {
private Completer createCompleter(final CompletionParameters cp) {
return new BaseCompleter() {
@Override
public Runnable complete(int selectionIndex, Token... tokens) {
int i = index + delta;
TokenListEditor<?> tokenListEditor = getTokenListEditor();
ObservableList<Token> editorTokenList = tokenListEditor.tokens;
if (i < editorTokenList.size() && tokens.length >= 1 && tokens[0] instanceof ValueToken && editorTokenList.get(i) instanceof ValueToken) {
editorTokenList.remove(i);
}
for (Token t : tokens) {
editorTokenList.add(i++, t);
}
tokenListEditor.processComments();
tokenListEditor.updateToPrintedTokens();
Runnable result;
int targetIndex = index + delta + selectionIndex;
final Cell targetCell = mySync.tokenCells().get(targetIndex);
if (isComment(targetCell)) {
result = new Runnable() {
@Override
public void run() {
targetCell.focus();
((TextCell) targetCell).caretPosition().set(getCommentPrefixLength(targetCell));
}
};
} else {
result = getTokenOperations().selectOnCreation(targetIndex, LAST);
}
if (cp.isEndRightTransform() && !cp.isMenu()) {
result = seq(result, activateCompletion(targetIndex));
}
return result;
}
};
}
private TokenCompletionContext createContext(CompletionParameters cp) {
if (cp.isEndRightTransform()) {
return new TokenCompletionContext(index + 1);
}
return new TokenCompletionContext(index + delta);
}
@Override
public Iterable<CompletionItem> get(final CompletionParameters cp) {
return tokenCompletion(createContext(cp), createCompleter(cp)).get(cp);
}
@Override
public Async<? extends Iterable<CompletionItem>> getAsync(CompletionParameters cp) {
if (cp.isMenu()) {
return getEditorSpec().getAdditionalCompletion(createContext(cp), createCompleter(cp)).getAsync(cp);
}
return Asyncs.<Iterable<CompletionItem>>constant(new ArrayList<CompletionItem>());
}
};
}