private static void afterItemInsertion(
     final CompletionProgressIndicator indicator, final Runnable laterRunnable) {
   if (laterRunnable != null) {
     final Runnable runnable1 =
         new Runnable() {
           @Override
           public void run() {
             if (!indicator.getProject().isDisposed()) {
               laterRunnable.run();
             }
             indicator.disposeIndicator();
           }
         };
     if (ApplicationManager.getApplication().isUnitTestMode()) {
       runnable1.run();
     } else {
       ApplicationManager.getApplication().invokeLater(runnable1);
     }
   } else {
     indicator.disposeIndicator();
   }
 }
    @Override
    public void itemSelected(LookupEvent event) {
      LookupElement item = event.getItem();
      if (item == null) return;

      char c = event.getCompletionChar();
      if (myCheckCompletionChar && !LookupEvent.isSpecialCompletionChar(c)) {
        return;
      }

      final Project project = myContext.getProject();
      if (project == null) {
        return;
      }

      Runnable runnable =
          () ->
              new WriteCommandAction(project) {
                @Override
                protected void run(@NotNull com.intellij.openapi.application.Result result)
                    throws Throwable {
                  Editor editor = myContext.getEditor();
                  if (editor != null) {
                    TemplateState templateState = TemplateManagerImpl.getTemplateState(editor);
                    if (templateState != null) {
                      templateState.considerNextTabOnLookupItemSelected(item);
                    }
                  }
                }
              }.execute();
      if (ApplicationManager.getApplication().isUnitTestMode()) {
        runnable.run();
      } else {
        ApplicationManager.getApplication()
            .invokeLater(runnable, ModalityState.current(), project.getDisposed());
      }
    }