in hybrid/src/main/java/jetbrains/jetpad/hybrid/HybridWrapperRoleCompletion.java [66:184]
public CompletionSupplier createRoleCompletion(final Mapper<?, ?> mapper, ContainerT contextNode, final Role<WrapperT> target) {
return new CompletionSupplier() {
@Override
public List<CompletionItem> get(final CompletionParameters cp) {
List<CompletionItem> result = new ArrayList<>();
final BaseCompleter completer = new BaseCompleter() {
@Override
public Runnable complete(int selectionIndex, Token... tokens) {
WrapperT targetItem = myFactory.get();
target.set(targetItem);
Mapper<?, ?> targetItemMapper = mapper.getDescendantMapper(targetItem);
BaseHybridSynchronizer<?, ?> sync = mySyncProvider.apply(targetItemMapper);
sync.setTokens(Arrays.asList(tokens));
CellTraitEventSpec<Event> traitEvent = cp.isMenu() ? Cells.AFTER_COMPLETED : Cells.AFTER_EDITED;
sync.getTargetList().iterator().next().dispatch(new Event(), traitEvent);
return targetItemMapper.isAttached()
? sync.selectOnCreation(selectionIndex, LAST)
: Runnables.EMPTY;
}
};
if (cp.isBulkCompletionRequired()) {
result.add(new BaseCompletionItem() {
@Override
public String visibleText(String text) {
throw new IllegalStateException("This completion item must not be visible");
}
@Override
public int getMatchPriority() {
return super.getMatchPriority() - 1;
}
@Override
public boolean isStrictMatchPrefix(String text) {
return !isMatch(text);
}
@Override
public boolean isMatch(String text) {
return isNotBlank(text);
}
@Override
public Runnable complete(final String text) {
return new Runnable() {
@Override
public void run() {
CompletionTokenizer tokenizer = new CompletionTokenizer(mySpec);
List<Token> tokens = tokenizer.tokenize(text);
if (!tokens.isEmpty()) {
completer.complete(tokens.toArray(new Token[tokens.size()])).run();
}
}
};
}
});
} else {
if (!(cp.isMenu() && myHideTokensInMenu)) {
for (final CompletionItem ci : mySpec.getTokenCompletion(new Function<Token, Runnable>() {
@Override
public Runnable apply(Token input) {
return completer.complete(input);
}
}).get(cp)) {
result.add(new WrapperCompletionItem(ci) {
@Override
public int getMatchPriority() {
return super.getMatchPriority() - 1;
}
});
}
}
if (cp.isMenu()) {
CompletionSupplier compl = mySpec.getAdditionalCompletion(new CompletionContext() {
@Override
public int getTargetIndex() {
return 0;
}
@Override
public List<Token> getPrefix() {
return Collections.emptyList();
}
@Override
public List<Cell> getViews() {
return Collections.emptyList();
}
@Override
public List<Token> getTokens() {
return Collections.emptyList();
}
@Override
public List<Object> getObjects() {
return Collections.emptyList();
}
@Override
public Mapper<?, ?> getContextMapper() {
return mapper;
}
@Override
public Object getTarget() {
return target.get();
}
}, completer);
result.addAll(FluentIterable.from(compl.get(new BaseCompletionParameters())).toList());
}
}
return result;
}
};
}