void (@NotNull final CompletionParameters parameters, @NotNull ProcessingContext context, @NotNull CompletionResultSet result) { ProgressManager.checkCanceled(); final PsiFile file = parameters.getPosition().getContainingFile(); if (file instanceof PsiPlainTextFile && EditorTextField.managesEditor(parameters.getEditor())) { return; } PrefixMatcher matcher = result.getPrefixMatcher(); if (matcher instanceof CamelHumpMatcher && ((CamelHumpMatcher)matcher).isTypoTolerant()) { // template matching uses editor content, not the supplied matcher // so if the first typo-intolerant invocation didn't produce results, this one won't, too return; } Editor editor = parameters.getEditor(); int offset = editor.getCaretModel().getOffset(); final List<TemplateImpl> availableTemplates = TemplateManagerImpl.listApplicableTemplates( TemplateActionContext.expanding(file, editor)); final Map<TemplateImpl, String> templates = filterTemplatesByPrefix(availableTemplates, editor, offset, false, false); boolean isAutopopup = parameters.getInvocationCount() == 0; if (shouldShowAllTemplates()) { final AtomicBoolean templatesShown = new AtomicBoolean(false); final CompletionResultSet finalResult = result; boolean showLiveTemplatesOnTop = Registry.is("ide.completion.show.live.templates.on.top"); if (showLiveTemplatesOnTop) { ensureTemplatesShown(templatesShown, templates, availableTemplates, finalResult, isAutopopup); showCustomLiveTemplates(parameters, result); } result.runRemainingContributors(parameters, completionResult -> { finalResult.passResult(completionResult); if (completionResult.isStartMatch()) { ensureTemplatesShown(templatesShown, templates, availableTemplates, finalResult, isAutopopup); } }); ensureTemplatesShown(templatesShown, templates, availableTemplates, result, isAutopopup); if (!showLiveTemplatesOnTop) { showCustomLiveTemplates(parameters, result); } return; } if (!isAutopopup) return; // custom templates should handle this situation by itself (return true from hasCompletionItems() and provide lookup element) // regular templates won't be shown in this case if (!customTemplateAvailableAndHasCompletionItem(null, editor, file, offset)) { TemplateImpl template = findFullMatchedApplicableTemplate(editor, offset, availableTemplates); if (template != null) { result.withPrefixMatcher(template.getKey()) .addElement(new LiveTemplateLookupElementImpl(template, true)); } } for (Map.Entry<TemplateImpl, String> possible : templates.entrySet()) { ProgressManager.checkCanceled(); String templateKey = possible.getKey().getKey(); String currentPrefix = possible.getValue(); result.withPrefixMatcher(currentPrefix) .restartCompletionOnPrefixChange(templateKey); } }