@Override
  public void syncUpdateOnCaretMove(@NotNull UpdateParameterInfoContext context) {
    if (!Registry.is("editor.completion.hints.virtual.comma")) return;

    Project project = context.getProject();
    Editor editor = context.getEditor();
    if (editor instanceof EditorWindow) return;
    int inlaysBeforeCaretWithComma = getInlaysBeforeCaretWithComma(editor);
    if (inlaysBeforeCaretWithComma == 0) return;

    EditorUtil.performBeforeCommandEnd(() -> {
      if (project.isDisposed() || editor.isDisposed()) return;
      // repeat the check, just in case
      int countAgain = getInlaysBeforeCaretWithComma(editor);
      if (countAgain == 0) return;

      Caret caret = editor.getCaretModel().getCurrentCaret();
      int caretOffset = caret.getOffset();
      String textToInsert = StringUtil.repeat(", ", inlaysBeforeCaretWithComma);
      WriteAction.run(() -> editor.getDocument().insertString(caretOffset, textToInsert));
      caret.moveToOffset(caretOffset + textToInsert.length());

      PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
      PsiElement exprList = context.getParameterOwner();
      if (!(exprList instanceof PsiExpressionList) || !exprList.isValid()) return;
      PsiElement call = exprList.getParent();
      if (call == null || !call.isValid()) return;
      int index = ParameterInfoUtils.getCurrentParameterIndex(exprList.getNode(), editor.getCaretModel().getOffset(), JavaTokenType.COMMA);
      asyncHighlightHints(editor, (PsiExpressionList)exprList, index, context.getCustomContext());
    });
  }
@Override
  public void syncUpdateOnCaretMove(@NotNull UpdateParameterInfoContext context)